package com.example.forum.dao;

import com.example.forum.model.ArticleReply;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ArticleReplyMapper {
    int deleteByPrimaryKey(Long id);

    int insert(ArticleReply record);

    int insertSelective(ArticleReply record);

    ArticleReply selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(ArticleReply record);

    int updateByPrimaryKey(ArticleReply record);

    List<ArticleReply> selectByArticleId(Long articleId);
    
    /**
     * 根据文章ID查询所有回复，并关联用户信息
     * @param articleId 文章ID
     * @return 带有用户信息的回复列表
     */
    List<ArticleReply> selectByArticleIdWithUser(Long articleId);

    /**
     * 根据用户ID分页查询评论列表
     * @param userId 用户ID
     * @param offset 偏移量
     * @param limit 查询条数
     * @return 用户评论列表
     */
    List<ArticleReply> selectByUserId(@Param("userId") Long userId, 
                                      @Param("offset") Integer offset, 
                                      @Param("limit") Integer limit);
    
    /**
     * 统计用户评论总数
     * @param userId 用户ID
     * @return 评论总数
     */
    Integer countByUserId(@Param("userId") Long userId);
    
    /**
     * 分页查询评论列表，支持关键词搜索和状态筛选
     * @param offset 偏移量
     * @param limit 查询条数
     * @param keyword 搜索关键词
     * @param status 状态筛选
     * @return 评论列表
     */
    List<ArticleReply> selectByPage(@Param("offset") Integer offset, 
                                   @Param("limit") Integer limit, 
                                   @Param("keyword") String keyword, 
                                   @Param("status") Byte status);
    
    /**
     * 根据条件统计评论数量
     * @param keyword 搜索关键词
     * @param status 状态筛选
     * @return 评论数量
     */
    int countByCondition(@Param("keyword") String keyword, 
                         @Param("status") Byte status);
                         
    /**
     * 获取所有符合条件的评论（不分页），用于精确统计有效评论数
     * @param keyword 搜索关键词
     * @param status 状态筛选
     * @return 符合条件的所有评论
     */
    List<ArticleReply> selectAllByCondition(@Param("keyword") String keyword, 
                                          @Param("status") Byte status);
                                          
    /**
     * 统计所有有效评论数量（评论未删除且关联文章未删除）
     * @return 有效评论总数
     */
    int countTotalReplies();
    
    /**
     * 统计今日新增的有效评论数量
     * @return 今日新增有效评论数
     */
    int countTodayNewReplies();
}